From: Keir Fraser Date: Tue, 17 Mar 2009 10:36:51 +0000 (+0000) Subject: xend: Add lock for xen-api class instances in XendAPIStore.py X-Git-Tag: archive/raspbian/4.8.0-1+rpi1~1^2~13992^2~69 X-Git-Url: https://dgit.raspbian.org/%22http://www.example.com/cgi/success//%22http:/www.example.com/cgi/success/?a=commitdiff_plain;h=90797ec872bb00dacc4f177927a2516fc374b793;p=xen.git xend: Add lock for xen-api class instances in XendAPIStore.py Add __classes_lock to protect __classes, since it can be modified by the udev listener thread. Signed-off-by: Yosuke Iwamatsu --- diff --git a/tools/python/xen/xend/XendAPIStore.py b/tools/python/xen/xend/XendAPIStore.py index dc313717dd..6876f2e6fb 100644 --- a/tools/python/xen/xend/XendAPIStore.py +++ b/tools/python/xen/xend/XendAPIStore.py @@ -25,36 +25,59 @@ You must register both the uuid and type, and get objects by type, to ensure safety """ +import threading + __classes = {} +__classes_lock = threading.RLock() def register(uuid, type, inst): - __classes[(uuid, type)] = inst - return inst + __classes_lock.acquire() + try: + __classes[(uuid, type)] = inst + return inst + finally: + __classes_lock.release() def deregister(uuid, type): - old = get(uuid, type) - if old is not None: - del __classes[(uuid, type)] - return old + __classes_lock.acquire() + try: + old = get(uuid, type) + if old is not None: + del __classes[(uuid, type)] + return old + finally: + __classes_lock.release() def get(uuid, type): """ Get the instances by uuid and type """ - return __classes.get((uuid, type), None) + __classes_lock.acquire() + try: + return __classes.get((uuid, type), None) + finally: + __classes_lock.release() def get_all(all_type): """ Get all instances by type """ - return [inst - for ((uuid, t), inst) in __classes.items() - if t == all_type] + __classes_lock.acquire() + try: + return [inst + for ((uuid, t), inst) in __classes.items() + if t == all_type] + finally: + __classes_lock.release() def get_all_uuid(all_type): """ Get all uuids by type """ - return [uuid - for (uuid, t) in __classes.keys() - if t == all_type] + __classes_lock.acquire() + try: + return [uuid + for (uuid, t) in __classes.keys() + if t == all_type] + finally: + __classes_lock.release()